package com.jhj.service.user.impl;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jhj.po.user.model.DictCoupons;
import com.jhj.po.user.model.UserCoupons;
import com.jhj.po.user.model.Users;
import com.jhj.utils.AppResultData;
import com.jhj.utils.BeanUtilsExp;
import com.jhj.utils.Constants;
import com.jhj.utils.DateUtil;
import com.jhj.utils.MathBigDecimalUtil;
import com.jhj.vo.user.UserCouponVo;
import com.jhj.service.impl.BaseServiceImpl;
import com.jhj.service.user.DictCouponService;
import com.jhj.service.user.UserCouponsService;


@Service
public class UserCouponsServiceImpl extends BaseServiceImpl<UserCoupons> implements UserCouponsService {
	@Autowired
	private DictCouponService dictCouponService;
	
	@Override
	public UserCouponVo getVo(UserCoupons item, DictCoupons dictCoupon) {
		UserCouponVo vo = new UserCouponVo();
		BeanUtilsExp.copyPropertiesIgnoreNull(item, vo);
		vo.setCouponName(dictCoupon.getIntroduction());
		vo.setMaxValue(dictCoupon.getMaxValue());
		vo.setServiceTypeName(dictCoupon.getServiceTypeName());
		return vo;
	}
	
	/**
	 * 验证用户优惠劵兑换的方法，适用于用户通过兑换码兑换优惠劵 1. 优惠劵是否已经无效，结束时间超过当前时间 2.
	 * 如果为唯一优惠劵，则需要判断是否被其他用户兑换过 3. 该用户是否已经兑换过该优惠劵
	 */
	@Override
	public AppResultData<Object> validateCoupon(Users u, DictCoupons dictCoupon, Integer serviceOrderType, Integer serviceTypeId, BigDecimal orderPay) {

		AppResultData<Object> result = new AppResultData<Object>(Constants.SUCCESS_0, "ok", "");
		DictCoupons coupons=dictCouponService.selectByPrimaryKey(dictCoupon.getId());		
		// 1. 优惠劵是否未到开始时间
		if (dictCoupon.getFromDate().after(DateUtil.getNowOfDate())) {
			result.setStatus(Constants.ERROR_999);
			result.setMsg("要兑换的优惠券活动还未开始。");
			return result;
		}
		
		
		// 1. 优惠劵是否已经无效，结束时间超过当前时间
		if (dictCoupon.getToDate().before(DateUtil.getNowOfDate())) {
			coupons.setIsValid("0");
			dictCouponService.update(coupons);
			result.setStatus(Constants.ERROR_999);
			result.setMsg("要兑换的优惠券已过期。");
			return result;
		}
		Integer userId = u.getId();
		Integer couponId = dictCoupon.getId();
		UserCoupons userCouponSearchVo = new UserCoupons();
		// 2. 如果为唯一优惠劵，则需要判断是否被其他用户兑换过
		if (dictCoupon.getRangType().equals(1)) {
			userCouponSearchVo = new UserCoupons();
			userCouponSearchVo.setCouponId(couponId);
			
			List<UserCoupons> list = this.selectBySearchVo(userCouponSearchVo, "");
			if (!list.isEmpty()) {
				for (UserCoupons item : list) {
					if (!item.getUserId().equals(userId)) {
						result.setStatus(Constants.ERROR_999);
						result.setMsg("优惠券无效！");
						return result;
					}
					
				}
			}
		}

		// 3.优惠劵是否已经被使用过
		userCouponSearchVo = new UserCoupons();
		userCouponSearchVo.setCouponId(couponId);
		userCouponSearchVo.setUserId(userId);
		userCouponSearchVo.setIsUsed(1);
		List<UserCoupons> listExist = this.selectBySearchVo(userCouponSearchVo, "");

		if (listExist != null && listExist.size() > 0) {
			result.setStatus(Constants.ERROR_999);
			result.setMsg("优惠券无效,已经被使用过");
			return result;
		}
		
		//判断订单类型是否正确
		if (!dictCoupon.getServiceOrderType().equals(serviceOrderType)) {
			result.setStatus(Constants.ERROR_999);
			result.setMsg("优惠券无效, 订单类型不符合");
			return result;
		}
		
		if (!dictCoupon.getServiceType().equals(serviceTypeId)) {
			result.setStatus(Constants.ERROR_999);
			result.setMsg("优惠券无效, 服务类型不符合");
			return result;
		}
		
		//4. 如果orderPay大于0，则需要判断是否满足满减的需求  
		BigDecimal maxValue = dictCoupon.getMaxValue();
		if (maxValue.compareTo(new BigDecimal(0)) == 1) {
			if (orderPay.compareTo(maxValue) == -1) {
				result.setStatus(Constants.ERROR_999);
				result.setMsg("优惠券无效, 不符合满减金额");
				return result;
			}
		}
		
		//并且还需要判断优惠金额不能>   orderPay(阿姨工资的)50%
		BigDecimal coupon =  dictCoupon.getValue();
		BigDecimal  pay50= MathBigDecimalUtil.div(orderPay, new BigDecimal(2));
		if (coupon.compareTo(new BigDecimal(0)) == 1) {
			if (coupon.compareTo(pay50) == 1) {
				result.setStatus(Constants.ERROR_999);
				result.setMsg("优惠券的优惠不能大于阿姨工资的50%");
				return result;
			}
		}
		return result;
	}

}
